/**
 * Kelas Bidang
 * @class Bidang
 * @file Bidang.h
 * @author Mirza W.
 * @date 8 Maret 2012
 */

#ifndef _BIDANG_H_
#define _BIDANG_H_

#include<iostream>
#include "../Point/Point.h"
#include "../Sel/Sel.h"

class Bidang{

public:
    
    /**
     * Konstruktor kelas bidang
     * @param n jumlah segi yang dimiliki oleh Bidang
     * @param P Lokasi Seluruh Sudut(Segi) yang dimiliki oleh Bidang
     * @param cont Content dari bidang
     */
	Bidang(const int n, Point* P, char cont = '*');
	
	/**
	 * Copy konstruktor kelas bidang
     * @param X Bidang original
     */
	Bidang(const Bidang& X);
	
	/**
	 * Operator assignment kelas bidang
     * @param X Bidang original
     * @return reference terhadap bidang
     */
	Bidang& operator=(const Bidang& X);
	
	/**
	 * Destruktor dari kelas bidang
     */
	~Bidang();
	
    /**
     * Operator Stream Output untuk kelas Bidang
     * @param stream Buffer Output
     * @param B Suatu Bidang
     * @return Output Stream
     */
	friend ostream& operator<< (ostream& stream, const Bidang& B);

	/**
	 * Mengembalikan banyak sudut dari bidang
     * @return Jumlah sudut dari bidang
     */
	int GetN();
	
	/**
	 * Mengembalikan isi dari bidang
	 * (Asumsi isi dari bidang homogen)
     * @return Isi dari bidang
     */
	char GetContent();
	
	/**
	 * Mengembalikan Point dari sudut ke-n
     * @param n sudut ke 
     * @return Point dari sudut ke n
     */
	Point& GetSudutN(const int n);
    
	/**
     * Mengecek apabila suatu bidang segi4 dengan bottomleft(a,c) dan topright(b,d) berada dalam latar
     * @param a
     * @param b
     * @param c
     * @param d
     * @return suatu bidang segi4 dengan bottomleft(a,c) dan topright(b,d) berada dalam latar
     */
    bool inLatar(int a,int b,int c,int d);
	
    /**
     * Menghapus semua sudut bidang dan mengganti seluruh konten menjadi * 
     */
	void Sweep();
    
    /**
     * Menggeser seluruh sudut(segi) pad bidang sebanyak (x,y)
     * @param x Absis
     * @param y Ordinat
     */
	void Move(int x,int y);
    
    /**
     * Melakukan mirror terhadap bidang
     * @param P1 Suatu Point
     * @param P2 Suatu Point
     */
	//void Mirror(const Point P1,const Point P2);
	
private:
	int nPoint;
	int minAbsis,minOrdinat,maxAbsis,maxOrdinat;
	char content;
	Point* Sudut;
  
};

#endif
